package chapter02.s02datatype;

public class PrimitiveTypeTest {
    public static void main(String[] args) {
        /**
         * 整数类型
         */
        // byte 8位
        System.out.println("基本类型：byte 二进制位数：" + Byte.SIZE);
        System.out.println("包装类：java.lang.Byte");
        System.out.println("最小值：Byte.MIN_VALUE=" + Byte.MIN_VALUE);
        System.out.println("最大值：Byte.MAX_VALUE=" + Byte.MAX_VALUE);
        System.out.println();

        // short 16位
        System.out.println("基本类型：short 二进制位数：" + Short.SIZE);
        System.out.println("包装类：java.lang.Short");
        System.out.println("最小值：Short.MIN_VALUE=" + Short.MIN_VALUE);
        System.out.println("最大值：Short.MAX_VALUE=" + Short.MAX_VALUE);
        System.out.println();

        // int 32位
        System.out.println("基本类型：int 二进制位数：" + Integer.SIZE);
        System.out.println("包装类：java.lang.Integer");
        System.out.println("最小值：Integer.MIN_VALUE=" + Integer.MIN_VALUE);
        System.out.println("最大值：Integer.MAX_VALUE=" + Integer.MAX_VALUE);
        System.out.println();

        // long 64位
        System.out.println("基本类型：long 二进制位数：" + Long.SIZE);
        System.out.println("包装类：java.lang.Long");
        System.out.println("最小值：Long.MIN_VALUE=" + Long.MIN_VALUE);
        System.out.println("最大值：Long.MAX_VALUE=" + Long.MAX_VALUE);
        System.out.println();

        /**
         * 浮点数类型
         */
        // float 32位
        System.out.println("基本类型：float 二进制位数：" + Float.SIZE);
        System.out.println("包装类：java.lang.Float");
        System.out.println("最小值：Float.MIN_VALUE=" + Float.MIN_VALUE);
        System.out.println("最大值：Float.MAX_VALUE=" + Float.MAX_VALUE);
        System.out.println();

        // double 64位
        System.out.println("基本类型：double 二进制位数：" + Double.SIZE);
        System.out.println("包装类：java.lang.Double");
        System.out.println("最小值：Double.MIN_VALUE=" + Double.MIN_VALUE);
        System.out.println("最大值：Double.MAX_VALUE=" + Double.MAX_VALUE);
        System.out.println();

        /**
         * 字符型
         */
        // char 16位， 0~65535，本质是无符号的2字节数字
        System.out.println("基本类型：char 二进制位数：" + Character.SIZE);
        System.out.println("包装类：java.lang.Character");
        // 以数值形式而不是字符形式将Character.MIN_VALUE输出到控制台
        System.out.println("最小值：Character.MIN_VALUE="
                + (int) Character.MIN_VALUE);
        // 以数值形式而不是字符形式将Character.MAX_VALUE输出到控制台
        System.out.println("最大值：Character.MAX_VALUE="
                + (int) Character.MAX_VALUE);

        /**
         * 布尔型
         * true false
         */
        //boolean
        System.out.println("基本类型：boolean");
        System.out.println("包装类：java.lang.Boolean");

        // 做些测试。
        // 定义 基本类型byte、包装类Byte
        //   变量  常量
        //    |     |
        byte by = 127;
        by = 126;
        Byte by1 = 127;
        short sh = 32767;
        Short sh1 = 32767;
        int i = 100;
        Integer i1 = 100;
        long l = 100L;
        Long l1 = 100L;

        char ch = 'a';
        Character ch1 = 'a';

        float f = 1.23f;  // f结尾表示float
        Float f1 = 1.23f;
        double d = 1.23d; // d结尾表示float
        Double d1 = 1.23; // 小数的默认类型double

        boolean bool = true;
        String str = "a String";

        System.out.println("Bool :" + bool);
        System.out.println("Byte :" + by);
        System.out.println("Character:" + ch);
        System.out.println("Double :" + d);
        System.out.println("Float :" + f);
        System.out.println("Integer :" + i);
        System.out.println("Long :" + l);
        System.out.println("Short :" + sh);
        System.out.println("String :" + str);

        // 二进制、八进制、十进制、十六进制的整数表示
        //二进制变量的声明以0b为前缀；
        //八进制变量的声明以0为前缀；
        //十六进制变量的声明以0x为前缀。

        int radix2 = 0b11111110;
        System.out.println("二进制0b11111110: " + radix2);

        int radix8 = 010;
        System.out.println("八进制010: " + radix8);

        int radix16 = 0x10;
        System.out.println("十六进制0x10: " + radix16);

        /**
         * 类型转换
         */
        /*
         * 自动类型转换：
         * 由编译器自动完成
         * 两个条件，第一是两种数据类型彼此兼容，第二是目标类型的取值范围大于源类型的取值范围
         * 低  ------------------------------------>  高
         * byte,short,char—> int —> long—> float —> double
         */
        char c1 = 'a';//定义一个char类型
        int c1_int = c1;//char自动类型转换为int
        System.out.println("char自动类型转换为int后的值等于" + i1);
        char c2 = 'A';//定义一个char类型
        int c2_int = c2 + 1;//char 类型和 int 类型计算
        System.out.println("char类型和int计算后的值等于" + c2_int);

        /*
         * 强制类型转换：
         * 显式地声明
         * 两种类型彼此不兼容，或者目标类型取值范围小于源类型
         * 强制类型转换格式：目标类型  变量 = （目标类型）值
         * 低  ------------------------------------>  高
         * byte,short,char—> int —> long—> float —> double
         */
        int num = 4;
        //报错，需要强制转换。
        //byte num_byte = num;
        byte num_byte = (byte) num;
        System.out.println(num_byte);

    }
}
